#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
 
int g_val = 10;
  
int main()
{
    pid_t id = fork();
    if(id == 0)  //子进程
    {
        int cnt = 6;
        while(cnt--)
        {
            printf("I am a child process! g_val = %d, &g_val = %p\n", g_val, &g_val);
            sleep(1);
  
            if(cnt == 3)  //子进程修改共享数据
            {
                g_val = 200;
                printf("child modify g_val: 100->200\n");
            }
        }
    }
    else  //父进程
    {
        int cnt = 6;
        while(cnt--)                                                                                                        
        {
            printf("I am a father process! g_val = %d, &g_val = %p\n", g_val, &g_val);
            sleep(1);
        }
    }
 
   return 0;
}

   
//int g_val1 = 100;
//int g_val2;
//     
//int main(int argc, char* argv[], char* env[])
//{
//    printf("code adr:%p\n", main);  //正文代码
//    printf("init data code:%p\n", &g_val1);  //初始化全局变量
//    printf("uninit data code:%p\n", &g_val2);  //未初始化全局变量
//    
//    char* heap1 = (char*)malloc(10);  
//    char* heap2 = (char*)malloc(10);
//    char* heap3 = (char*)malloc(10);
//    char* heap4 = (char*)malloc(10);
//        
//    printf("stack adr:%p\n", &heap1);  //栈
//    printf("stack adr:%p\n", &heap2);
//    printf("stack adr:%p\n", &heap3);
//    printf("stack adr:%p\n", &heap4);
//    
//    printf("heap adr:%p\n", heap1);  //堆
//    printf("heap adr:%p\n", heap2);
//    printf("heap adr:%p\n", heap3);
//    printf("heap adr:%p\n", heap4);
//                                                       
//    for(int i = 0; i < 2; i++)  //命令行参数表
//    printf("命令行参数表%d adr:%p\n", i, argv + i);  
//    for(int i = 0; i < 2; i++)  //环境变量表
//    printf("环境变量表%d adr:%p\n", i, env + i); 
//    
//    for(int i = 0; argv[i]; i++)   //命令行参数
//        printf("argv[%d]=%p\n", i, argv[i]); 
//    for(int i = 0; env[i]; i++)   //环境变量
//        printf("env[%d]=%p\n", i, env[i]);
//   
//    return 0;
//}

